
归并排序是一种分治算法，它的主要思想是将原始数组分成较小的数组，直到每个小数组只有一个位置，接着将小数组归并成较大的数组，直到最后只有一个排序完毕的大数组。

归并排序（Merge Sort）是一种基于分治思想的排序算法，它将原问题分成若干个子问题，递归求解子问题，最后将子问题的解合并起来，得到原问题的解。归并排序的时间复杂度为 O(nlogn)，相较于冒泡排序、插入排序等算法，它更加高效。

- JavaScript 中的归并排序可以分为三个步骤：
  - 分割：将原数组分成两个数组，分别排序
  - 合并：将两个排好序的子数组合并成一个数组
  - 递归：对每个子数组递归执行上述步骤

```js 
function mergeSort(arr) {
  if (arr.length <= 1) {
    return arr;
  }
  const mid = Math.floor(arr.length / 2);
  const leftArr = arr.slice(0, mid);
  const rightArr = arr.slice(mid);
  return merge(mergeSort(leftArr), mergeSort(rightArr));
}

function merge(leftArr, rightArr) {
  let i = 0;
  let j = 0;
  const result = [];
  while (i < leftArr.length && j < rightArr.length) {
    if (leftArr[i] < rightArr[j]) {
      result.push(leftArr[i]);
      i++;
    } else {
      result.push(rightArr[j]);
      j++;
    }
  }
  while (i < leftArr.length) {
    result.push(leftArr[i]);
    i++;
  }
  while (j < rightArr.length) {
    result.push(rightArr[j]);
    j++;
  }
  return result;
}

// 示例
const arr = [5, 3, 8, 6, 4];
console.log(mergeSort(arr)); // 输出 [3, 4, 5, 6, 8]

```
在这段代码中，mergeSort 函数用于递归调用自身，将数组分割成两个子数组，并将其返回。merge 函数用于合并两个子数组，它比较两个子数组的元素，将它们按照从小到大的顺序依次加入到一个新的数组 result 中，并返回该数组。最终，在 mergeSort 函数的外部，我们将排序好的数组输出到控制台中。

:::info
需要注意的是，在 merge 函数中，我们使用了 while 循环来处理两个子数组中元素数量不一致的情况。在其中，我们使用了 i 和 j 两个变量来分别追踪两个子数组中元素的位置。当一个子数组中所有元素都已经加入到 result 数组中时，我们将另一个子数组中剩余的元素全部加入到 result 数组中。
:::